<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0058)http://sites.google.com/site/steveyegge2/my-dot-emacs-file -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<SCRIPT type="text/javascript">/* Copyright 2008 Google. */ (function() { // Input 0
var a=window;
// Input 1
var b="start";function d(f){this.t={};this.tick=function(g,h,c){c=c?c:(new Date).getTime();this.t[g]=[c,h]};this.tick(b,null,f)}var e=new d;a.jstiming={Timer:d,load:e};try{var i=null;if(a.chrome&&a.chrome.csi)i=Math.floor(a.chrome.csi().pageT);if(i==null)if(a.gtbExternal)i=a.gtbExternal.pageT();if(i==null)if(a.external)i=a.external.pageT;if(i)a.jstiming.pt=i}catch(j){};
// Input 2
})()
</SCRIPT>
<LINK rel="shortcut icon" type="image/x-icon" href="http://www.google.com/images/icons/product/sites-16.ico">
<LINK rel="apple-touch-icon" href="http://www.gstatic.com/sites/p/f5c4f6/system/app/images/apple-touch-icon.png" type="image/png">
<SCRIPT type="text/javascript">/* Copyright 2008 Google. */ (function() { var e=parseInt,h=window,i="length";function j(c){return document.getElementById(c)}h.byId=j;var k="";function l(c){return c.replace(/^\s+|\s+$/g,k)}h.trim=l;
var m="MSIE",n="6.0",o="string",p='id="',q='" ',r='class="',s='title="',t="display:inline-block;",u="left",v="float:left;",w="right",x="float:right;",y="cursor:hand;",z="<span ",A=' style="width:',B="px; height:",C="px;",D=";padding: 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='",E="', sizingMethod='scale');\"></span><span style=\"padding: ",F=" ",G=";",H="float:",I='"></span>';
h.ie6ImgFix=function(c){var b=h.navigator?navigator.userAgent:k;if(b.indexOf(m)!=-1&&typeof opera=="undefined"){var d=/MSIE\s+([^\);]+)(\)|;)/;d.test(b);b=RegExp.$1;if(b==n){var a=typeof c==o?j(c):c;c=a.id?p+a.id+q:k;b=a.className?r+a.className+q:k;d=a.title?s+a.title+q:s+a.alt+q;var f=t+a.style.cssText;if(a.align==u)f=v+f;if(a.align==w)f=x+f;if(a.parentElement.href)f=y+f;var g=a.currentStyle,L=a.width-e(g.paddingLeft,10)-e(g.paddingRight,10),M=a.height-e(g.paddingTop,10)-e(g.paddingBottom,10),N=
z+c+b+d+A+L+B+M+C+f+D+a.src+E+g.paddingTop+F+g.paddingRight+F+g.paddingBottom+F+g.paddingLeft+G+(g.styleFloat?H+g.styleFloat+G:k)+I;h.setTimeout(function(){a.outerHTML=N},1)}}};var J=[],K=0;h.JOT_addListener=function(c,b,d){var a=new String(K++);c={eventName:c,handler:b,compId:d,key:a};J.push(c);return a};h.JOT_removeListenerByKey=function(c){for(var b=0;b<J[i];b++)if(J[b].key==c){J.splice(b,1);break}};
h.JOT_removeAllListenersForName=function(c){for(var b=0;b<J[i];b++)J[b].eventName==c&&J.splice(b,1)};var O="function";h.JOT_postEvent=function(c,b,d){var a={eventName:c,eventSrc:b||{},payload:d||{}};if(h.JOT_fullyLoaded){b=J[i];for(d=0;d<b&&d<J[i];d++){var f=J[d];if(f&&f.eventName==c){a.listenerCompId=f.compId||k;(f=typeof f.handler==O?f.handler:h[f.handler])&&f(a)}}}else h.JOT_delayedEvents.push({eventName:c,eventSrc:b,payload:d})};h.JOT_delayedEvents=[];h.JOT_fullyLoaded=false;var P="__duration__";
h.JOT_formatRelativeToNow=function(c,b){var d=((new Date).getTime()-c)/6E4;if(d>=1440||d<0)return null;var a=0;if(d>=60){d/=60;a=2}d>=2&&a++;return b?h.JOT_siteRelTimeStrs[a].replace(P,Math.floor(d)):h.JOT_userRelTimeStrs[a].replace(P,Math.floor(d))}; })()
</SCRIPT>
<SCRIPT>


var webspace = {"signInUrl":"https://www.google.com/a/UniversalLogin?continue=http%3A%2F%2Fsites.google.com%2Fsite%2Fsteveyegge2%2Fmy-dot-emacs-file&service=jotspot","isConsumer":true,"termsUrl":"http://www.google.com/sites/help/intl/en/terms.html","enableAnalytics":false,"homePath":"/","sharingId":"jotspot","sharingPolicy":"OPENED","isAdsenseEnabled":true,"analyticsAccountId":"","baseUri":"/site/steveyegge2","name":"steveyegge2","features":{"horizontalNavigationDropdownMenus":false,"structuredDataGviz":false,"maestroIntegration":false,"subpageNav":false,"preserveOverlayOnThemeChange":true,"newPageFinder":true,"multipleCalendar":true,"enableNewBrowserEditChecks":true,"pdfEmbedSupport":false,"experimental":{"displayEditorLockExceptions":false},"useStandardEmbedsInSidebar":false,"navadminperf":true,"kixEmbedSupport":true,"lazySiteHierarchy":true,"adminInfo":false,"dragDropHierarchy":true,"headerAlignmentOptions":true,"horizontalNavigationBar":true,"presentlyEmbedUpdate":true,"keyboardShortcuts":false,"commonSharing":false,"structuredDataSchemas":false,"footerCustomOptions":true,"colorsAndFontsThemeOptions":true},"domain":"defaultdomain","adsensePublisherId":null,"isStartPageEnabled":false,"domainAnalyticsAccountId":"","siteTitle":"steveyegge2"};


webspace.gadgets = {"isGadgetDirectoryEnabled":true,"baseUri":"/site/steveyegge2/system/app/pages/gadgets","isGgsRenderingEnabled":true};


webspace.user = {"uid":"","hasAdminAccess":false,"guest_":true,"domain":"","hasWriteAccess":false,"userName":"guest","dasherUser":false,"primaryEmail":"guest","sessionIndex":"","namespaceUser":false,"displayNameOrEmail":"guest"};

webspace.page = {"canDeleteWebspace":null,"locale":"en","state":"","wuid":"wuid:gx:6295abea580d78df","timeZone":"America/Los_Angeles","properties":{},"type":"text","canChangePath":true,"parentWuid":null,"revision":1,"title":"my-dot-emacs-file","isRtlLocale":false,"bidiEnabled":false,"siteLocale":"en","name":"my-dot-emacs-file","path":"/my-dot-emacs-file","isSiteRtlLocale":false,"parentPath":null};


var editorResources = [
  'http://www.gstatic.com/sites/p/f5c4f6/system/js/trog_edit__en.js',
  'http://www.gstatic.com/sites/p/f5c4f6/system/app/css/trogedit.css',
  '/site/steveyegge2/_/rsrc/1283302502000/system/app/css/editor.css'
];

var JOT_clearDotPath = 'http://www.gstatic.com/sites/p/f5c4f6/system/app/images/cleardot.gif';


var JOT_userRelTimeStrs = ["a minute ago","__duration__ minutes ago","an hour ago","__duration__ hours ago"];


webspace.page.currentTemplate = {"title":"Web Page","path":"/system/app/pagetemplates/text"};





var JOT_siteRelTimeStrs = ["a minute ago","__duration__ minutes ago","an hour ago","__duration__ hours ago"];

</SCRIPT>
<SCRIPT type="text/javascript">
                window.jstiming.load.tick('scl');
              </SCRIPT>
<LINK rel="stylesheet" type="text/css" href="./yegge-emacs.el_files/standard-css-microlite-ltr-ltr.css">
<LINK rel="stylesheet" type="text/css" href="./yegge-emacs.el_files/overlay.css">
<TITLE>my-dot-emacs-file - steveyegge2</TITLE>
<SCRIPT type="text/javascript">
                window.jstiming.load.tick('cl');
              </SCRIPT>
<SCRIPT src="./yegge-emacs.el_files/ga.js"></SCRIPT><SCRIPT>window["_GOOG_TRANS_EXT_VER"] = "1";</SCRIPT></HEAD><BODY xmlns="http://www.google.com/ns/jotspot" id="body" class=" en">
<DIV id="sites-page-toolbar">
<DIV id="sites-status" class="sites-status" style="display:none;">
<DIV id="sites-notice" class="sites-notice"> </DIV>
</DIV>
</DIV>
<DIV id="sites-chrome-everything" style="direction: ltr">
<DIV id="sites-chrome-page-wrapper">
<DIV id="sites-chrome-page-wrapper-inside">
<DIV xmlns="http://www.w3.org/1999/xhtml" id="sites-chrome-header-wrapper">
<TABLE id="sites-chrome-header" class="sites-layout-hbox" cellspacing="0">
<TBODY><TR class="sites-header-primary-row">
<TD id="sites-header-title">
<DIV class="sites-header-cell-buffer-wrapper">
<H2>
</H2>
</DIV>
</TD>
<TD class="sites-layout-searchbox">
<DIV class="sites-header-cell-buffer-wrapper">
<DIV>
</DIV>
</DIV>
</TD>
</TR>
<TR class="sites-header-secondary-row">
<TD colspan="2">
</TD>
</TR>
</TBODY></TABLE> 
</DIV> 
<DIV id="sites-chrome-main-wrapper">
<DIV id="sites-chrome-main-wrapper-inside">
<TABLE id="sites-chrome-main" class="sites-layout-hbox" cellspacing="0">
<TBODY><TR>
<TD id="sites-canvas-wrapper">
<DIV id="sites-canvas">
<DIV id="goog-ws-editor-toolbar-container"> </DIV>
<DIV xmlns="http://www.w3.org/1999/xhtml" id="title-crumbs" style="display: none;">
</DIV>
<H3 xmlns="http://www.w3.org/1999/xhtml" id="sites-page-title-header" style="display: none;" align="left">
<SPAN id="sites-page-title" dir="ltr">my-dot-emacs-file</SPAN>
</H3>

<DIV id="sites-canvas-main" class="sites-canvas-main">
<DIV id="sites-canvas-main-content">
<DIV xmlns="http://www.w3.org/1999/xhtml" class="sites-layout-name-one-column-hf sites-layout-vbox"><DIV class="sites-layout-tile sites-tile-name-header"><P>my .emacs file&nbsp;</P><BR><A href="http://sites.google.com/site/steveyegge2/blog-rants">Stevey's Drunken Blog Rants™</A></DIV><DIV class="sites-layout-tile sites-tile-name-content-1"><P>Occasionally people ask to see my .emacs file. This always throws me for a sec. It feels like they've asked if they can take a peek at my Linux file, or my Windows file. The question doesn't make sense at first, until I remember that it's a perfectly natural question if you haven't really grasped the Zen of Emacs. </P>
<P>But since they've asked so often, here it is. My .emacs file...</P>
<P></P>
<HR>
<PRE><FONT color="#006400">;;;<BR>;;; Stevey's .emacs file. Loads up lots of libraries.<BR>;;;<BR></FONT> <FONT color="#006400">;; I use the Common Lisp stuff all the time<BR></FONT>(<FONT color="#0000cd">require</FONT> '<FONT color="#696969">cl</FONT>)<BR><BR><FONT color="#006400">;; I keep all my emacs-related stuff under ~/emacs<BR></FONT>(<FONT color="#0000cd">defvar</FONT> <FONT color="#a0522d">emacs-root</FONT> (<FONT color="#0000cd">if</FONT> (<FONT color="#0000cd">or</FONT> (eq system-type 'cygwin)<BR>			 (eq system-type 'gnu/linux)<BR>			 (eq system-type 'linux))<BR>		 <FONT color="#4169e1">"/home/stevey/"</FONT> 		 <FONT color="#4169e1">"c:/home/stevey/"</FONT>)<BR> <FONT color="#4169e1">"My home directory — the root of my personal emacs load-path."</FONT>)<BR><BR><FONT color="#006400">;; add all the elisp directories under ~/emacs to my load path<BR></FONT>(<FONT color="#0000cd">labels</FONT> ((add-path (p)<BR>	 (add-to-list 'load-path<BR>			(concat emacs-root p))))<BR> (add-path <FONT color="#4169e1">"emacs/lisp"</FONT>) <FONT color="#006400">;; all my personal elisp code<BR></FONT> (add-path <FONT color="#4169e1">"emacs/lisp/ttest"</FONT>) <FONT color="#006400">;; a typing-test package I wrote<BR></FONT> (add-path <FONT color="#4169e1">"emacs/site-lisp"</FONT>) <FONT color="#006400">;; elisp stuff I find on the 'net<BR></FONT> (add-path <FONT color="#4169e1">"emacs/calc-2.02f"</FONT>) <FONT color="#006400">;; fix for M-x calc on NT Emacs<BR></FONT> (add-path <FONT color="#4169e1">"emacs/vm-7.04"</FONT>) <FONT color="#006400">;; a fancy mail client<BR></FONT> (add-path <FONT color="#4169e1">"emacs/jde-2.3.2/lisp"</FONT>) <FONT color="#006400">;; Java IDE support<BR></FONT> (add-path <FONT color="#4169e1">"emacs/jde-2.3.2/elib-1.0"</FONT>)<BR> (add-path <FONT color="#4169e1">"emacs/jde-2.3.2/eieio-0.17"</FONT>)<BR> (add-path <FONT color="#4169e1">"emacs/jde-2.3.2/speedbar-0.14beta4"</FONT>)<BR> (add-path <FONT color="#4169e1">"emacs/jde-2.3.2/semantic-1.4.4"</FONT>)<BR><BR> (add-path <FONT color="#4169e1">"emacs/site-lisp/nxml-mode"</FONT>) <FONT color="#006400">;; XML support<BR></FONT> (add-path <FONT color="#4169e1">"emacs/site-lisp/tuareg-mode-1.41.5"</FONT>) <FONT color="#006400">;; OCaml support<BR></FONT> (add-path <FONT color="#4169e1">"emacs/site-lisp/emacs-wiki-2.67.1"</FONT>) <FONT color="#006400">;; personal Wiki<BR></FONT> )<BR> <BR><FONT color="#006400">;; I use the same .emacs and elisp files everywhere. I make sure<BR>;; everything works in both GNU Emacs 21.x and XEmacs on various<BR>;; platforms, including native Windows XP, Cygwin on Windows XP,<BR>;; and various flavors of Linux, in windowing and terminal modes.<BR></FONT> (<FONT color="#0000cd">require</FONT> '<FONT color="#696969">emacs-type</FONT>) <FONT color="#006400">;; support for multiple emacs platforms<BR></FONT> (load-library <FONT color="#4169e1">"ekeys"</FONT>) <FONT color="#006400">;; my key bindings and some aliases<BR></FONT>(load-library <FONT color="#4169e1">"modes"</FONT>) <FONT color="#006400">;; configuration for 100-odd emacs modes<BR></FONT>(if-not-terminal<BR> (<FONT color="#0000cd">progn</FONT> (<FONT color="#0000cd">ignore-errors</FONT> (<FONT color="#0000cd">require</FONT> '<FONT color="#696969">jde</FONT>))<BR> (load-library <FONT color="#4169e1">"myfont"</FONT>))) <FONT color="#006400">;; my own fonts and window colors<BR></FONT> (load-library <FONT color="#4169e1">"efuncs"</FONT>) <FONT color="#006400">;; a bunch of my own utility functions<BR></FONT>(load-library <FONT color="#4169e1">"my-config"</FONT>) <FONT color="#006400">;; one-off variable settings<BR></FONT>(load-library <FONT color="#4169e1">"java-config"</FONT>) <FONT color="#006400">;; java/python/ruby IDE setup<BR></FONT>(load-library <FONT color="#4169e1">"mail-config"</FONT>) <FONT color="#006400">;; smtp config for various locations<BR></FONT>(load-library <FONT color="#4169e1">"perl-config"</FONT>) <FONT color="#006400">;; extra support for perl coding<BR></FONT>(load-library <FONT color="#4169e1">"screen-config"</FONT>) <FONT color="#006400">;; window positioning for all platforms<BR></FONT>(load-library <FONT color="#4169e1">"xml-config"</FONT>) <FONT color="#006400">;; a few xml and html helper functions<BR></FONT> (if-not-xemacs (<FONT color="#0000cd">require</FONT> '<FONT color="#696969">kawa-support</FONT>)) <FONT color="#006400">;; some helpers for Kawa Scheme<BR></FONT> <FONT color="#006400">;; startup "script" for when we've got a window system<BR></FONT>(if-not-terminal<BR> (<FONT color="#0000cd">progn</FONT> <FONT color="#006400">;; start gnuserv, so apps can talk to us (e.g. p4, browsers)<BR></FONT> (<FONT color="#0000cd">when</FONT> (<FONT color="#0000cd">or</FONT> google<BR>	 (<FONT color="#0000cd">and</FONT> winnt (not cygwin)))<BR> (<FONT color="#0000cd">require</FONT> '<FONT color="#696969">gnuserv</FONT>)<BR> (setq gnuserv-frame (selected-frame))<BR> (gnuserv-start))<BR><BR> <FONT color="#006400">;; set the fonts and colors I like<BR></FONT> (global-font-lock-mode t)<BR> (parchment-screen)<BR> (set-default-font linux-font)<BR> (set-mouse-color <FONT color="#4169e1">"black"</FONT>)<BR><BR> <FONT color="#006400">;; position window automatically based on display resolution<BR></FONT> (size-screen)))<BR><BR><FONT color="#006400">;; load in customizations, which I keep in their own little petting zoo<BR></FONT>(load-library <FONT color="#4169e1">"~/.custom"</FONT>)<BR><BR><FONT color="#006400">;; I always run a shell in Emacs. Always always.<BR></FONT>(shell)<BR><BR><FONT color="#006400">;;; end .emacs</FONT> </PRE>
<HR>
<P></P>
<P>That's it! About 90 lines, including blank lines and comments. That's why I give you a funny look for a sec if you ask to see it. There isn't much to see. </P>
<P>My .emacs "file" is actually a directory tree, which I always keep under my home directory: /home/stevey/emacs. I have about 10k lines of Emacs-lisp code of my own, and a quarter million lines, in over 400 files, that I've gotten off the net from various places, such as <A href="http://www.anc.ed.ac.uk/~stephen/emacs/ell.html" rel="nofollow">this one.</A> </P>
<P>My emacs tree also has a fonts/ directory with Windows versions of some of my favorite Unix fonts (the sony fixed-width ones, my favorite being the one called "7x13"), an info/ directory with over 400 Emacs info files (individually gzipped, of course), and misc odds and ends: stuff written in perl, java, python, all tools to help integrate Emacs with my other applications. </P>
<P>The whole thing is under CVS (soon to be Subversion) control, with the repository hosted on a server in the Westin building in downtown Seattle, for which I pay a monthly colocation fee. </P>
<P>The server is remote-controlled via radio waves emitted by a giant radioactive moth from a concrete bunker at the center of a huge blimp that orbits Jupiter. Or so it would seem, since it's the only possible explanation for why server only seems to go down on Friday afternoons, right before my ISP's employees leave on holiday. Other than that, it works great. </P>
<P>I can check out my Emacs tree onto any computer with Linux or Cygwin, make a handful of local tweaks to the .emacs file, and I'm up and running. The same set of files works no matter how I'm running Emacs, including: </P>
<P></P>
<UL>
<LI>on a Windows machine (NT Emacs) 
</LI><LI>on a Linux machine under X (GNU Emacs) 
</LI><LI>on a Windows machine using the Cygwin-compiled GNU Emacs 
</LI><LI>ssh'ed remotely into a Linux box 
</LI><LI>ssh'ed remotely into a Windows box, running Cygwin bash 
</LI><LI>misc video modes and screen resolutions </LI></UL>
<P>I try to keep things working with XEmacs, or at least loading without errors. I use XEmacs occasionally, but it's never been stable enough for me to get hooked on it. </P>
<H3><A name="TOC-Emacs-the-Operating-System"></A>Emacs the Operating System</H3>
<P>So what is all that stuff, anyway? Who would need 400+ elisp files in 70+ directories? </P>
<P>Well, most it is from a handful of big applications for Emacs. I'll mention some of the really major ones briefly, since they're all pretty cool. </P>
<H4><A name="TOC-JDEE"></A>JDEE</H4>
<P>Paul Kinnucan is the author of the <A href="http://jdee.sunsite.dk/" rel="nofollow">JDEE</A>, or Java Development Environment for Emacs. It turns Emacs into something approximating an IDE for Java development. The website has some screen shots you can check out under the "JDEE Quick Tour". </P>
<P>It's an absolutely unbelievable pain in the arse to install. And his website is buggy, and the code is often buggy, and I generally detest the application, and Paul K's no picnic himself. Other than that, it's great. </P>
<P>In practice, it has some features that I find absolutely <EM>indispensable</EM> when I'm doing Java coding, which is fairly often. In particular, being able to open a Java file, compile it, and run it (with stdout/stderr going to a buffer) is just ... I'd die without it. And jumping to compile errors, of course. There might be other features I use, but not too many. I've wrestled with both debuggers it ships with, and have gotten them working a few times, but Java debugging has never been very good, regardless of the IDE. Not for big, multithreaded applications anyway. </P>
<P>I don't use it for syntax highlighting; I use an ancient file called andersl-java-font-lock.el that I've hacked up a lot. JDEE supposedly has 1.5-compliant highlighting now, so maybe I should try, once again, to fix all his frigging bugs so I can use it. </P>
<P>I don't use his stuff for code-template generation either; I wrote my own template-generation package for Java years ago, and it works better than his does, IMO. I donated it to Paul's JDEE project in 1998, and he loved it. He rewrote it just enough that he didn't need to give me any credit for it, which is half of why I think he's such a dick. The other half is that he produces such buggy, crappy code, web pages, installers, docs, and everything else. </P>
<P>But it's a <EM>monster</EM> application, clocking in at something like 80,000 lines of elisp and 20,000 lines of Java, or about 30% of my total elisp code tree. And it takes advantage of many other Emacs packages, so it has a surprising amount of functionality (that he takes credit for in his web pages.) </P>
<P>But enough Kinnucan-bashing. JDEE is what we Emacs users have for Java development today. And on the whole, it's not too bad, really. It's starting to get refactoring tools added in, since it has a full parser for the Java language, and it has class browsing and auto-completion and all that fun stuff. </P>
<H4><A name="TOC-Calc"></A>Calc</H4>
<P>This is Dave Gillespie's unbelievable calculator application. Rather than trying to describe it, I'll just copy Dave's description of it out of the Info file: </P>
<P><FONT color="#00688b"></FONT></P><FONT color="#00688b"><PRE>"Calc" is an advanced calculator and mathematical tool that runs<BR>as part of the GNU Emacs environment. Very roughly based on the<BR>HP-28/48 series of calculators, its many features include:<BR><BR> * Choice of algebraic or RPN (stack-based) entry of calculations.<BR><BR> * Arbitrary precision integers and floating-point numbers.<BR><BR> * Arithmetic on rational numbers, complex numbers (rectangular<BR> and polar), error forms with standard deviations, open and<BR> closed intervals, vectors and matrices, dates and times,<BR> infinities, sets, quantities with units, and algebraic formulas.<BR><BR> * Mathematical operations such as logarithms and trigonometric functions.<BR><BR> * Programmer's features (bitwise operations, non-decimal numbers).<BR><BR> * Financial functions such as future value and internal rate of return.<BR><BR> * Number theoretical features such as prime factorization and<BR> arithmetic modulo M for any M.<BR><BR> * Algebraic manipulation features, including symbolic calculus.<BR><BR> * Moving data to and from regular editing buffers.<BR><BR> * "Embedded mode" for manipulating Calc formulas and data<BR> directly inside any editing buffer.<BR><BR> * Graphics using GNUPLOT, a versatile (and free) plotting program.<BR><BR> * Easy programming using keyboard macros, algebraic formulas,<BR> algebraic rewrite rules, or extended Emacs Lisp.</PRE></FONT>
<P></P>
<P>To be honest, I mostly use it for arithmetic. Stack-based/RPN calculators are da bomb. I also occasionally use some of the actual scientific and math functions, or use it to display numbers in different radices. But I'm basically way, way underutilizing it. </P>
<P>You need calc-2.02f to run it on NT Emacs 21.x. I'm pretty sure I had to patch it, since I couldn't find an actual distribution of it, just a patch to 2.02. It's easy, though, and if you're intent on trying it, I can just send you a zipped-up copy. It's all in one subdirectory. </P>
<P>Calc alone is about 20% of the total elisp code in my tree. Dave Gillespie also wrote much of the Common Lisp support that comes bundled with Emacs, primarily for Calc's use. </P>
<H4><A name="TOC-VM"></A>VM</H4>
<P>This is Kyle Jones' mail program for Emacs and XEmacs. I used it as my primary mail client for about 10 years, until a combination of the Spam problem and our switch to Exchange finally drove me to Outlook. But I'm a wimp. I should go back. </P>
<P>VM's source code comprises about 16% of total in my emacs tree. But all I use it for these days is its mail-send mode, sadly. </P>
<P>I also hear gnus is very good email client. Haven't tried it, but people absolutely swear by it. Someday I'll go back to Emacs as my mailer — maybe next year, since it'll take some work — and life will be happy again. </P>
<H4><A name="TOC-nXML-mode"></A>nXML-mode</H4>
<P>James Clark, one of the original creators of XML, implemented <A href="http://www.thaiopensource.com/nxml-mode/" rel="nofollow">nXML-mode</A> sometime in 2003 as far as I can tell. It's a comprehensive plug-in that turns Emacs into a powerful XML editor. </P>
<P>It's another 10% of my total lisp glob. Just under half the nXML elisp files are data files for character sets. </P>
<H4><A name="TOC-Other-big-apps"></A>Other big apps</H4>
<P>Those four plug-ins (JDEE, Calc, VM, and nXML-mode) make up about 75% of the Emacs plug-in code that I use, at least by volume. </P>
<P>There are various other big applications for Emacs, including: </P>
<UL>
<LI>
<P><A href="http://mywebpages.comcast.net/jyavner/ses/" rel="nofollow">SES</A>, a spreadsheet app (there are a few other spreadsheet applications for Emacs; not sure which one is the best. Calc works fine for most of my purposes.) </P>
</LI><LI>
<P><A href="http://www.cs.indiana.edu/elisp/w3/docs.html" rel="nofollow">W3</A>, a web browser. </P>
</LI><LI>
<P><A href="http://tnt.sourceforge.net./" rel="nofollow">TNT</A>, a very cool Emacs client for AIM </P>
</LI><LI>
<P><A href="http://www.newartisans.com/johnw/EmacsChess.html" rel="nofollow">chess.el</A> - EmacsChess </P></LI></UL>
<P>And gosh, a whole bunch of others as well. Plus there are lots of them distributed with the standard GNU Emacs distribution. </P>
<H3><A name="TOC-Indispensable-Apps"></A>Indispensable Apps</H3>
<P>Here are some built-in, stock, out-of-the-box Emacs utilities that I use all the time. If you're using Emacs 21, you should have all of these automatically. For Emacs 20 and lower, may I recommend upgrading to Emacs 21? It's only, like, 100 years old now. It's safe. You can do it. Be brave. </P>
<P>OK, in no particular order, here are the "applications" that I think are the most interesting within Emacs, and I use them all the time. </P>
<H4><A name="TOC-Shell"></A>Shell</H4>
<P>Yep, I run a bash shell inside of Emacs, sometimes more than one. Indispensable. Can't live without it. </P>
<P>There are some differences from using a "real" bash shell, meaning one running in a reasonably powerful terminal emulator such as <A href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" rel="nofollow">PuTTY</A> or an xterm. The biggest thing that's missing is the ability to do curses/ncurses stuff. (Curses is a C/Unix library that knows about lots of terminal types, and provides a device-independent way to do text-base "UIs" in a terminal.) </P>
<P>So a fair number of Unix (and Windows) programs don't work properly inside an Emacs shell, notably: </P>
<UL>
<LI>ssh, rlogin and telnet 
</LI><LI>top 
</LI><LI>nethack </LI></UL>
<DIV>(Note: the apps above all have "native Emacs ports", though)</DIV>
<P>However, most utilities <B>do</B> work, and for the ones that don't (poor Nethack excepted), there's almost always a better way to do it using "native" Emacs functionality. For instance, you can run ssh or telnet in a subprocess using terminal-mode, which does provide full terminal emulation. And if you were really set on it, you could probably write an Emacs frontend to Unix top. Probably someone has; it's just really hard to search for on Google because "top" is such a common word. </P>
<P>In order to use Emacs shell effectively, you have to have a real terminal window open on the same desktop, and get used to switching over to it whenever you have a task that requires a true terminal. Which is almost never, these days. Emacs shell support is pretty solid. </P>
<P>And as for the advantages... well, it's Emacs! It's not just command-line editing any more; you have the entire history of your shell interaction (for that session) in a buffer, all nicely syntax-highlighted, and you can go back and perform any editing operations you like. </P>
<P>To use Bash with NT Emacs on Windows boxen, you should install <A href="http://www.cygwin.com/" rel="nofollow">Cygwin</A>. It's easy, although it takes a while, since it's essentially turning your Windows machine into a Unix-compatible one. </P>
<P>My advice for you, if you use Cygwin: install it in your root directory, "c:\" or whatever your drive letter is. Don't let it use the default installation dir of c:\cygwin (or wherever the default is). The installer will warn you and say it's a bad idea. Ignore the warning. They're wrong. It's the <EM>only</EM> way to use Cygwin, and to make Cygwin usable, and it's the only way that Emacs will ever truly be happy interacting with Cygwin. </P>
<P>I've been installing it to root (on various computers) and using it that way for at least 3 years, and it's <EM>never</EM> caused a problem. They're just worried some application will come along and biff your /lib or /bin directory. Trust me: it won't happen. Applications these days stick themselves in "Program Files" or in "My Documents", or in some other godawful long directory path with spaces in it. Cygwin will be safe. </P>
<P>Once you've installed Cygwin, you have essentially a full Unix (mostly Linux-compatible) distribution on your Windows box. It has shells, X11, all the unix utilities, Apache, everything you want. Most Linux applications compile under Cygwin these days - it's supported directly by their autoconf and makefiles. </P>
<P>Cygwin is a better desktop Unix than Linux. Really. I've used both for many years. Linux for servers, Cygwin on your desktop. You'll never have a device-driver problem again, you'll never have to worry about RedHat switching all the config-file locations around from release to release, and you can throw Exceed right out the window. </P>
<P>Anyway, once Cygwin is installed, you can have bash (or zsh if you prefer) running inside an Emacs buffer. I recommend NT Emacs over Cygwin Emacs because it performs a bit better. But they're both great, and the Cygwin version has some bells and whistles that the NT one doesn't, such as inline image support. </P>
<H4><A name="TOC-Calendar"></A>Calendar</H4>
<P>Type M-x calendar, and you'll see a pretty 3-month calendar display, scrollable left and right with "&lt;" and "&gt;", and all the holidays highlighted. Mouse-click on a day to get a popup menu, or move the cursor to a day and type "h" to see what holiday it is. It has appointments, lunar phases, daylight savings time indicators, time-interval tracking, and integration with the Emacs diary (another built-in app). </P>
<P>Calendar is just cool. Can't live without it. </P>
<P>However, as far I'm concerned, they got the "&lt;" and "&gt;" keys reversed, and the scrolling is totally unintuitive for me. So stick this into your .emacs file if you want to reverse them as well: </P>
<P></P><PRE><FONT color="#006400">;; Fix foolish calendar-mode scrolling.<BR></FONT>(add-hook 'calendar-load-hook<BR> '(<FONT color="#0000cd">lambda</FONT> ()<BR> (setq mark-holidays-in-calendar t)<BR> (define-key calendar-mode-map <FONT color="#4169e1">"&gt;"</FONT> 'scroll-calendar-left)<BR> (define-key calendar-mode-map <FONT color="#4169e1">"&lt;"</FONT> 'scroll-calendar-right)<BR> (define-key calendar-mode-map <FONT color="#4169e1">"\C-x&gt;"</FONT> 'scroll-calendar-left)<BR> (define-key calendar-mode-map <FONT color="#4169e1">"\C-x&lt;"</FONT> 'scroll-calendar-right)))<BR></PRE>
<P></P>
<P>The "mark-holidays-in-calendar" setting highlights all the days that are holidays, which is kind of nice. </P>
<P>Calendar rocks. </P>
<H4><A name="TOC-Other-Stuff"></A>Other Stuff </H4>
<P>Plus there's other stuff. </P>
<P>The "other stuff" that you find for Emacs typically falls into the following categories: </P>
<P></P>
<UL>
<LI>
<P>stuff that enhances your editing, such as <A href="http://fresh.homeunix.net/~luke/misc/emacs/chop.el" rel="nofollow">chop.el</A>, which moves the cursor around your screen in a binary search. It's nifty. These tend to affect the behavior of your entire Emacs session, although not always. </P>
</LI><LI>
<P><EM>modes</EM> for every file format, programming language, or interactive process in the known universe. Modes are, well, modes - they change the behavior of Emacs in various ways. A simple one might simply have its own set of key bindings, syntax coloring, comment syntax (for comment-region), indentation rules, stuff like that. A complex mode might have thousands of lines of code, perform network operations, and offer hundreds of new functions. p4.el (the Perforce mode for Emacs) is a good example. Modes tend to be buffer-local. </P>
</LI><LI>
<P>"applications" such as games, spreadsheets, screen savers, diversions, productivity tools, specialized shells, you name it. Zillions of them. </P></LI></UL>
<P></P>
<P>There isn't really a clear-cut distinction between these categories; everything is essentially just a plugin. </P>
<H3><A name="TOC-My-Stuff"></A>My Stuff</H3>
<P>Then there's all the stuff I've written for myself. </P>
<P>I have a bunch of my own keybindings and little aliases (such as "qrr" instead of "query-replace-regexp") in "ekeys.el". Not that interesting. </P>
<P>"modes.el" is where I cram most of my mode-specific customizations and autoloads. Most of the functions start with "fix-". Fix this, fix that. The great thing about Emacs is that well-written plug-ins are themselves extensible; people have been known to ship plug-ins that modify other plug-ins. Dunno if anyone's made it to the 3rd metalevel yet, but it wouldn't surprise me. </P>
<P>"my-config.el" is where I override all the standard stuff - a lot of it would normally be handled these days through M-x customize, but this file predates customize by about a decade. </P>
<P>There are some REALLY cool settings that Emacs doesn't have on by default, such as (auto-compression-mode 1), which automatically parses the archive of a gzip/zip/jar/tar or basically any other archive when you open it in Emacs, and lets you selectively open (and modify and save!) files inside of archives - including files in archives in other archives. </P>
<P>I have a "screen-config.el" that has a bunch of functions that decide where to put Emacs when it starts up, depending on the screen dimensions and other stuff. It also has functions I wrote that will change the color theme: black background, gray background, white background, to reduce eyestrain. Although these days I usually just use white, since it's not actually all that white on LCD monitors. </P>
<P>My "mail-config.el" file has machine-specific settings for my incoming and outgoing mail setup: servers, hosts, reply-to addresses, etc. Also some functions that let me auto-insert certain email addresses and lists when I'm composing email in Emacs. </P>
<P>The "ttest" directory contains a little application I wrote, M-x typing-test, which tells you how fast you actually type inside of Emacs, with access to all your shortcuts. It's actually quite fancy, and does a more accurate job of computing words per minute than any typing-test software I've seen online, since I invented a fairly robust mechanism for detecting typing errors. It emits various stats on your speed and accuracy, has some customization options, and is probably one of the most ambitious elisp apps I've created. </P>
<P>"efuncs.el" is where I have most of my productivity functions - things I've written or accumulated that fill in gaps I think are missing from Emacs. Like this function, which assumes you have 2 buffers showing, and it swaps them: </P>
<P></P><PRE><FONT color="#006400">;; someday might want to rotate windows if more than 2 of them<BR></FONT>(<FONT color="#0000cd">defun</FONT> <FONT color="#b22222">swap-windows</FONT> ()<BR> <FONT color="#4169e1">"If you have 2 windows, it swaps them."</FONT> (interactive) (<FONT color="#0000cd">cond</FONT> ((not (= (count-windows) 2)) (message <FONT color="#4169e1">"You need exactly 2 windows to do this."</FONT>))<BR> (t<BR> (<FONT color="#0000cd">let*</FONT> ((w1 (first (window-list)))<BR>	 (w2 (second (window-list)))<BR>	 (b1 (window-buffer w1))<BR>	 (b2 (window-buffer w2))<BR>	 (s1 (window-start w1))<BR>	 (s2 (window-start w2)))<BR> (set-window-buffer w1 b2)<BR> (set-window-buffer w2 b1)<BR> (set-window-start w1 s2)<BR> (set-window-start w2 s1)))))<BR></PRE>
<P></P>
<P>Or these two, which I consider serious omissions in the lineup of standard file-manipulation functions: </P>
<P></P><PRE><FONT color="#006400">;;<BR>;; Never understood why Emacs doesn't have this function.<BR>;;<BR></FONT>(<FONT color="#0000cd">defun</FONT> <FONT color="#b22222">rename-file-and-buffer</FONT> (new-name)<BR> <FONT color="#4169e1">"Renames both current buffer and file it's visiting to NEW-NAME."</FONT> (interactive <FONT color="#4169e1">"sNew name: "</FONT>)<BR> (<FONT color="#0000cd">let</FONT> ((name (buffer-name))<BR>	(filename (buffer-file-name)))<BR> (<FONT color="#0000cd">if</FONT> (not filename)<BR>	(message <FONT color="#4169e1">"Buffer '%s' is not visiting a file!"</FONT> name)<BR> (<FONT color="#0000cd">if</FONT> (get-buffer new-name)<BR>	 (message <FONT color="#4169e1">"A buffer named '%s' already exists!"</FONT> new-name)<BR>	(<FONT color="#0000cd">progn</FONT> 	 (rename-file name new-name 1) 	 (rename-buffer new-name) 	 (set-visited-file-name new-name) 	 (set-buffer-modified-p nil)))))) <FONT color="#006400">;;<BR>;; Never understood why Emacs doesn't have this function, either.<BR>;;<BR></FONT>(<FONT color="#0000cd">defun</FONT> <FONT color="#b22222">move-buffer-file</FONT> (dir)<BR> <FONT color="#4169e1">"Moves both current buffer and file it's visiting to DIR."</FONT> (interactive <FONT color="#4169e1">"DNew directory: "</FONT>)<BR> (<FONT color="#0000cd">let*</FONT> ((name (buffer-name))<BR>	 (filename (buffer-file-name))<BR>	 (dir<BR>	 (<FONT color="#0000cd">if</FONT> (string-match dir <FONT color="#4169e1">"\\(?:/\\|\\\\)$"</FONT>)<BR>	 (substring dir 0 -1) dir))<BR>	 (newname (concat dir <FONT color="#4169e1">"/"</FONT> name)))<BR><BR> (<FONT color="#0000cd">if</FONT> (not filename)<BR>	(message <FONT color="#4169e1">"Buffer '%s' is not visiting a file!"</FONT> name)<BR> (<FONT color="#0000cd">progn</FONT> 	(copy-file filename newname 1) 	(delete-file filename) 	(set-visited-file-name newname) 	(set-buffer-modified-p nil) 	t)))) </PRE>
<P></P>
<P>There's tons of stuff in there. Mostly junk that only I would use. But that's the point! If you have an extensible system, you should extend it for yourself. Doesn't need to be packaged for public consumption. </P>
<H3><A name="TOC-Info-Files"></A>Info Files</H3>
<P>Lastly, and I consider this to be veeeery important to my productivity, I have a bunch of Info files. </P>
<P>You can find (or build) Info files out of the docs for just about anything. I have a custom "dir" node with at least 100 entries in it. I have the Perl 5 info pages, for example, which is essentially the full Camel book. And the Ruby info pages, and Python, and OCaml, Scheme, Common Lisp, Guile, a whole bunch of language references. All bookmarked heavily — Emacs has a very nice bookmark facility. </P>
<P>I also have info files for a bunch of Gnu tools, Emacs utilities, Unix utilities, all kinds of stuff. Thousands of pages of documentation, all conveniently organized and searchable. They're a lot more detailed than man pages, usually, and I use them extensively. Sure, you can find the docs online too, but I prefer having everything in one place... </P>
<P>In Emacs, of course. </P>
<H3><A name="TOC-That-s-all-folks."></A>That's all, folks.</H3>
<P>Anyway, that's a whirlwind tour of my .emacs "file". </P>
<P>I'm sure it's absolutely nothing compared to some of the elisp collections at Amazon. One of these days we're all going to have to get together and pool our stuff together. </P>
<DIV style="font-style:italic">(Published Sep 25th 2004)</DIV>
<P></P>
<HR>
<DIV style="font-weight:bold;text-align:center">Comments</DIV>
<HR>
<P></P>
<P>Nethack in Emacs: </P>
<P><A href="http://freshmeat.net/projects/nethack-el/" rel="nofollow">http://freshmeat.net/projects/nethack-el/</A> </P>
<P>Top in Emacs: </P>
<P><A href="http://lists.gnu.org/archive/html/gnu-emacs-sources/2004-07/msg00033.html" rel="nofollow">http://lists.gnu.org/archive/html/gnu-emacs-sources/2004-07/msg00033.html</A> </P>
<P><EM>Posted by</EM>: Derek U. at September 27, 2004 06:50 PM </P>
<P></P>
<HR>
<P></P>
<P>*laugh* - I can't believe I doubted Emacs even for a moment. Of <EM>course</EM> it can do Nethack and Top. Thanks Derek. </P>
<P><EM>Posted by</EM>: Steve Yegge at September 27, 2004 08:18 PM </P>
<P></P>
<HR>
<P></P>
<P>I've been trying to get bash/Cygwin to work under NT Emacs for *years*, and I've always been envious (yes, envious) of your success. I don't know what you did right in the first place to make it work, but after a non-trivial Google search, I finally found the magic incantation to make it work for me (listed at the end). For some reason, any command entered in the bash subshell resulted in ' : command not found': somehow, the command-line input wasn't being read correctly. </P>
<P>As for your advice to install Cygwin in C:\ instead of C:\cygwin: Yes, it will probably make things smoother, because more programs will agree on what "/" means, whether they're Cygwin or Windows apps. But the incantation installs some emacs filesystem hooks that translate between the two conventions, so stuff like Emacs filename completion within the interactive bash shell will work, etc. The downside is that it makes Emacs pause at startup while it sorts out the cygwin drive mounts. Someday I'll figure out how to run it as an asynchronous process. </P>
<P></P><PRE>(<FONT color="#0000cd">defconst</FONT> <FONT color="#a0522d">CYGWIN-BASE</FONT> <FONT color="#4169e1">"c:/cygwin"</FONT>)<BR>(<FONT color="#0000cd">defconst</FONT> <FONT color="#a0522d">CYGWIN-BIN</FONT> (concat CYGWIN-BASE <FONT color="#4169e1">"/bin"</FONT>))<BR>(setenv <FONT color="#4169e1">"PATH"</FONT> (concat CYGWIN-BIN <FONT color="#4169e1">";"</FONT> (getenv <FONT color="#4169e1">"PATH"</FONT>)))<BR>(setq exec-path (cons CYGWIN-BIN exec-path))<BR>(<FONT color="#0000cd">require</FONT> '<FONT color="#696969">cygwin-mount</FONT>) <FONT color="#006400">;; get from http://www.emacswiki.org/elisp/cygwin-mount.el<BR></FONT>(cygwin-mount-activate)<BR><BR>(setq shell-mode-hook 'bash-shell-setup)<BR><BR><FONT color="#006400">;; For the interactive shell<BR></FONT>(add-hook 'comint-output-filter-functions<BR> 'shell-strip-ctrl-m nil t)<BR>(add-hook 'comint-output-filter-functions<BR> 'comint-watch-for-password-prompt nil t)<BR>(add-hook 'shell-mode-hook 'bash-shell-setup)<BR><BR>(setq explicit-shell-file-name <FONT color="#4169e1">"bash"</FONT>)<BR><FONT color="#006400">;; For subprocesses invoked via the shell<BR>;; (e.g., "shell -c command")<BR></FONT>(setq shell-file-name explicit-shell-file-name)<BR><BR><FONT color="#006400">;; Sets the line-sending convention to \n, instead of \n\r<BR></FONT>(<FONT color="#0000cd">defun</FONT> <FONT color="#b22222">bash-shell-setup</FONT> ()<BR><FONT color="#4169e1"> "Sets up BASH shell processes to use Unix coding system"</FONT> (set-process-coding-system (get-buffer-process (current-buffer)) 'unix 'unix)) </PRE>
<P></P>
<P><EM>Posted by</EM>: Chris T. at September 28, 2004 06:10 PM </P>
<P></P>
<HR>
<P></P>
<P>Here's (as far as I know) what I do to get Cygwin working "properly": </P>
<P>- install it in c:\ </P>
<P>In Control Panel: </P>
<UL>
<LI>set HOME to /home/stevey 
</LI><LI>add c:\bin;c:\usr\local\bin; to front of PATH <BR>(make sure it's ahead of c:\windows\system32) 
</LI><LI>set CYGWIN to binmode ntsec tty </LI></UL>
<P></P>
<P>In my elisp configuration: </P>
<P></P><PRE>(setenv <FONT color="#4169e1">"HOME"</FONT> <FONT color="#4169e1">"/home/stevey"</FONT>)<BR><BR>(<FONT color="#0000cd">let</FONT> ((shellname <FONT color="#4169e1">"/bin/bash"</FONT>))<BR> (setenv <FONT color="#4169e1">"ESHELL"</FONT> shellname)<BR> (setenv <FONT color="#4169e1">"SHELL"</FONT> shellname)<BR> (setq shell-file-name shellname))<BR><BR>(load <FONT color="#4169e1">"comint"</FONT>)<BR>(setq comint-completion-addsuffix t)<BR>(setq comint-eol-on-send t)<BR></PRE>
<P></P>
<P>As far as I can tell, that's -everything- I needed to do in order to get Emacs to play nicely with cygwin bash shells. </P>
<P>It only partially understands "~" - if I type "cd ~" or "cd" in my bash shell in comint-mode, Emacs doesn't know I've changed directories. So I have to type "cd /home/stevey". However, if I M-x find-file, it will tab-complete ~ properly for me, so at some level it knows ~ is /home/stevey. I'd look into this if it bothered me enough, but it never has. </P>
<P>All that cruft that they give you to put in Emacs to "train" it on the Cygwin paths - not needed. I just got rid of all that years ago. </P>
<P><EM>Posted by</EM>: Steve Yegge at September 29, 2004 02:59 AM </P><P></P></DIV><DIV class="sites-layout-tile sites-tile-name-footer"><TABLE width="100%">
<TBODY>
<TR>
<TD width="100%"><A href="http://sites.google.com/site/steveyegge2/blog-rants">Back to Stevey's Drunken Blog Rants™</A> </TD>
<TD align="right"><IMG alt="image of my email address, steve dot yegge at ye olde gmail" src="./yegge-emacs.el_files/stevey-email.png"> </TD></TR></TBODY></TABLE>
<P></P></DIV></DIV>
</DIV> 
</DIV> 
<DIV id="sites-canvas-bottom-panel">
</DIV>
</DIV> 
</TD> 
</TR>
</TBODY></TABLE> 
</DIV> 
</DIV> 
<DIV id="sites-chrome-footer-wrapper">
<DIV id="sites-chrome-footer-wrapper-inside">
<DIV id="sites-chrome-footer">
</DIV>
</DIV>
</DIV>
</DIV> 
</DIV> 
<DIV xmlns="http://www.w3.org/1999/xhtml" class="sites-adminfooter">
<P>
           
              
                  &nbsp;
                  <A href="https://www.google.com/a/UniversalLogin?continue=http%3A%2F%2Fsites.google.com%2Fsite%2Fsteveyegge2%2Fmy-dot-emacs-file&service=jotspot" class="sites-system-link">Sign in</A>
                
              
                  &nbsp;
                  <A href="http://sites.google.com/site/steveyegge2/system/app/pages/recentChanges" rel="nofollow" class="sites-system-link">Recent Site Activity</A>
                
              
              &nbsp;
              <A href="javascript:void(window.open('http://www.google.com/sites/help/intl/en/terms.html'))" class="sites-system-link">Terms</A>
              &nbsp;
              <A href="http://sites.google.com/site/steveyegge2/system/app/pages/reportAbuse?src=/my-dot-emacs-file" rel="nofollow" target="_blank" class="sites-system-link">Report Abuse</A>
              
                  &nbsp;
                  <A href="javascript:;" onclick="window.open(webspace.printUrl)" class="sites-system-link">Print page</A>
                
              
              
              &nbsp;|&nbsp;
                
              <B class="powered-by">Powered by <A href="http://sites.google.com/">Google Sites</A></B>
</P>
</DIV>
</DIV> 

<SCRIPT xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
    window.jstiming.load.tick('sjl');
  </SCRIPT>

<SCRIPT xmlns="http://www.w3.org/1999/xhtml" src="./yegge-emacs.el_files/jot_min_view__en.js"></SCRIPT>
<SCRIPT xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
    window.jstiming.load.tick('jl');
  </SCRIPT>
<SCRIPT xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
  setTimeout(function() {
    var fingerprint = gsites.date.TimeZone.getFingerprint([1109635200000, 1128902400000, 1130657000000, 1143333000000, 1143806400000, 1145000000000, 1146380000000, 1152489600000, 1159800000000, 1159500000000, 1162095000000, 1162075000000, 1162105500000]);
    gsites.Xhr.send('http://sites.google.com/site/steveyegge2/_/tz', null, null, 'GET', null, null, { afjstz: fingerprint });
  }, 500);
</SCRIPT>
<SCRIPT xmlns="http://www.w3.org/1999/xhtml">
                    window.onload = function() {
                      var loadTimer = window.jstiming.load;
                      loadTimer.tick("ol");
                      loadTimer["name"] = "load," + webspace.page.type;
                      
                      window.jstiming.report(loadTimer);
                    }
                  </SCRIPT>
<SCRIPT xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
        JOT_insertAnalyticsCode(false);
      </SCRIPT>
<SCRIPT xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
  //<![CDATA[
    // Fires delayed events.
    (function() {
      JOT_fullyLoaded = true;
      var delayedEvents = JOT_delayedEvents;
      for (var x = 0; x < delayedEvents.length; x++) {
        var event = delayedEvents[x];
        JOT_postEvent(event.eventName, event.eventSrc, event.payload);
      }
      JOT_delayedEvents = null;
      JOT_postEvent('pageLoaded');
    })();

    // Decorate any fastUI buttons on the page with a class of 'goog-button'.
    if (webspace.user.hasWriteAccess) {
      JOT_decorateButtons();
    }
 //]]>
</SCRIPT>
<DIV id="server-timer-div" style="display:none"> </DIV>
<SCRIPT>
          window.jstiming.load.tick('render');
        </SCRIPT>


</BODY></HTML>